package com.blueocean_health.care.management.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.blueocean_health.care.management.common.base.string.StringUtils;
import com.blueocean_health.care.management.domain.base.Role;
import com.blueocean_health.care.management.domain.base.SysResult;
import com.blueocean_health.care.management.domain.base.UserTeam;
import com.blueocean_health.care.management.domain.dto.RoleAuthDto;
import com.blueocean_health.care.management.domain.dto.RoleDto;
import com.blueocean_health.care.management.domain.vo.RoleUserListVo;
import com.blueocean_health.care.management.mapper.RoleMapper;
import com.blueocean_health.care.management.mapper.UserMapper;
import com.blueocean_health.care.management.mapper.UserTeamMapper;
import com.blueocean_health.care.management.service.RoleAuthService;

/**
 * @author huyanqiu
 * @date 2018年3月27日 下午3:47:56
 * @version 版本号：1.0
 */
@Service
public class RoleAuthServiceImpl implements RoleAuthService {

	@Autowired
	private RoleMapper roleMapper;
	@Autowired
	private UserMapper userMapper;
	@Autowired
	private UserTeamMapper userTeamMapper;

	/**
	 * 编辑授权信息
	 */
	@Override
	public SysResult modify(RoleAuthDto roleAuthDto) {
		Role role = roleMapper.selectByPrimaryKey(roleAuthDto.getId());
		if (StringUtils.isEmpty(role)) {
			return SysResult.error("角色不存在");
		}
		Integer orgId = 0;
		if(role.getIsPublicRole() == 2) {
			// 自建角色，所有的角色都授权到角色所属的组织上
			orgId = role.getTeamId();
		} else {
			// 通用角色，组织是用户当前所选的组织，授权到当前所选的组织上
			orgId = Integer.parseInt(roleAuthDto.getOrgId());
		}
		roleAuthDto.setOrgId(String.valueOf(orgId));
		// 关联状态和角色状态保持一致
		roleAuthDto.setStatus(role.getIsActive() + "");
		
		// 查找角色关联的所有用户
		List<UserTeam> userTeamList = new ArrayList<UserTeam>();
		// 根据角色id、角色状态和组织Id查询角色授权用户列表
		userTeamList = userTeamMapper.findUserByRoleIdAndOrgId(roleAuthDto);
		Set<String> addUserRoleSet = new HashSet<>(roleAuthDto.getPrincipals());
		Set<String> removeUserRoleSet = new HashSet<>();
		userTeamList.forEach(userRole -> {
			removeUserRoleSet.add(userRole.getUserId() + "");
		});
		Set<String> copyRemoveUserRoleSet = new HashSet<>(removeUserRoleSet);

		// 需要删除集合
		removeUserRoleSet.removeAll(addUserRoleSet);
		// 需要增加集合
		addUserRoleSet.removeAll(copyRemoveUserRoleSet);
		if (!removeUserRoleSet.isEmpty()) {

			// 不允许给默认的负责人用户编辑授权
			boolean isPrincipals = false;
			for (String userId : removeUserRoleSet) {
				for (UserTeam userTeam : userTeamList) {
					if (userId.equals(userTeam.getUserId() + "") && !StringUtils.isEmpty(userTeam.getCategory())
							&& userTeam.getCategory().equals("1")) {
						isPrincipals = true;
						break;
					}
				}
			}
			if (isPrincipals) {
				return SysResult.error("不允许给默认的负责人用户编辑授权");
			}

			// 删除用户和组织关系，主要是维护通用角色 principals(用户) roleAuthDto.getOrgId()(组织信息)
			// （可能会有重复数据，得判断只能删除一条）
			int userTeamNum = userTeamMapper.deleteUserTeamByRoleSet(roleAuthDto, removeUserRoleSet);
			if (userTeamNum < 1) {
				return SysResult.error("删除用户组织关系失败");
			}
			// // 批量删除用户和角色中间表（可能会有重复数据，得判断只能删除一条）
			// int removeNum = userRoleMapper.deleteByRoleIdAndUserIdSet(roleAuthDto,
			// removeUserRoleSet);
			// if (removeNum < 1) {
			// return SysResult.error("编辑授权失败");
			// }
		}
		if (!addUserRoleSet.isEmpty()) {
			// 添加用户和组织关系 ，主要是维护通用角色 principals(用户) roleAuthDto.getOrgId()(组织信息)
			int userTeamNum = userTeamMapper.insertUserTeamBase(roleAuthDto, addUserRoleSet);
			if (userTeamNum < 1) {
				return SysResult.error("添加用户组织关系失败");
			}
			// // 批量新增用户和角色中间表
			// int userRoleNum = userRoleMapper.insertUserRoleBase(roleAuthDto,
			// addUserRoleSet);
			// if (userRoleNum < 1) {
			// return SysResult.error("编辑授权失败");
			// }
		}
		return SysResult.ok("编辑授权成功");
	}

	/**
	 * 获取授权信息 泰心端： 通用角色只显示指定组织的用户，非通用角色显示全量的用户 项目端：后期项目端获取角色授权，应该是对应项目下的用户
	 */
	@Override
	public SysResult query(Integer roleId, Integer orgId) {
		Role role = roleMapper.selectByPrimaryKey(roleId);
		if (StringUtils.isEmpty(role)) {
			return SysResult.error("该角色不存在");
		}
		if (role.getIsActive() == 3) {
			return SysResult.error("该角色已删除");
		}
		// 角色类型： 1：通用角色 2：非通用角色
		RoleAuthDto roleAuthDto = null;
		if (role.getIsPublicRole() == 2) {
			roleAuthDto = roleMapper.queryAuthDetail(roleId, orgId);
		} else {
			roleAuthDto = roleMapper.queryAuthPublicDetail(roleId, orgId);
		}
		return SysResult.ok(roleAuthDto);
	}

	/**
	 * 获取某组织下用户列表
	 */
	@Override
	public SysResult selectUserList() {
		List<RoleUserListVo> roleUserList = userMapper.selectUserList(new HashMap<>());
		return SysResult.ok(roleUserList);
	}

}
